home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / mac2gem.exe / MAC2GEM.C < prev    next >
Text File  |  1987-09-16  |  6KB  |  259 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <types.h>
  4. #include <stat.h>
  5. #include <io.h>
  6. #include <dos.h>
  7. #include <math.h>
  8. #include <argparse.h>
  9.  
  10. static    char * tutorial[] = {
  11.     "\nFormat is:\n\tmac picname <outname> <-m> <-n> <-t> <-c zz> <-p qqq>",
  12.     "<-x x.x> <-y y.y>\n\n",
  13.     "\tpicname is the name of the input readmac file\n",
  14.     "\toutname (optional) is the output file name\n",
  15.     "\t\twith MAC.LST as a default (device name\n",
  16.     "\t\tsuch as LPT2 is ok also)\n",
  17.     "\t-m\tdon\'t eject after printing\n",
  18.     "\t-n\tproduce negative copy of image\n",
  19.     "\t-t\tadd title (if any) after picture\n",
  20.     "\t-c zz\t(optional) produce zz copies, 0 < zz < 100\n",
  21.     "\t\tdefault number of copies is 1\n",
  22.     "\t-p qqq\t(optional) pells/inch, qqq = 100, 150 or 300\n",
  23.     "\t\tdefault pells is 100\n",
  24.     "\t-x x.x\t(optional) x offset in fractional inches\n",
  25.     "\t\tdefault offset is 1.0 inch from left edge\n",
  26.     "\t-y y.y\t(optional) y offset in fractional inches\n",
  27.     "\t\tdefault offset is 0.5 inch from top edge\n",
  28.     NULL };
  29. #define linelen  60  /* was 72 */
  30. static    unsigned char buff[74];
  31. static    unsigned char wline[] = { 0x80, linelen };
  32. static    unsigned char header[] = { 0x00,0x01, 0x00,0x08, 0x00,0x01, 0x00,0x02,
  33.                    0x01,0xA3, 0x01,0xFC, 0x01,0xe0, 0x02,0xd0 };
  34. static    unsigned int  bcnt;
  35. FILE    *f = NULL;
  36. int    c = 0;
  37. int    copies = 1;
  38. int    pells = 100;
  39. int    print = 0;
  40. int    neg = 0;
  41. int    x_offset = 810;
  42. int    y_offset = 360;
  43.  
  44. void putline()
  45. {
  46. register int i;
  47.     buff[72] = 0x00;
  48.     write(print,wline,2);
  49.     if(neg != 0)
  50.        for(i=0;i<72;i++)
  51.           buff[i] = ~buff[i];
  52.     for(i=0;i<linelen;i++)
  53.        buff[i] = buff[i+6];
  54.     write(print,buff,linelen);
  55. }
  56.  
  57. int expand(rep)
  58. int rep;
  59. {
  60.     rep = 257 - rep;    /* rep count */
  61.     c = fgetc(f);        /* read count */
  62.     if(c == EOF) {
  63.        printf("Error - unexpected eof\n");
  64.        exit(1);
  65.        }
  66.     for(;rep;rep--,bcnt++) {
  67.        buff[bcnt] = c;
  68.        if(bcnt == 72) break;
  69.        }
  70. }
  71.  
  72. int getline()
  73. {
  74. int  i,j;
  75.     bcnt = 0;
  76.     while(bcnt < 72) {
  77.        j = fgetc(f);        /* read count */
  78.        if(j == EOF) {
  79.           printf("Warning - unexpected EOF\n");
  80.           return(1);
  81.           }
  82.        if(j > 127) expand(j);
  83.        else {
  84.           j++;
  85.           if((j+bcnt) > 72) j = 71 - bcnt;
  86.           i = fread(&buff[bcnt],1,j,f);
  87.           if(i != j) {
  88.          printf("Warning - unexpected EOF\n");
  89.          return(1);
  90.          }
  91.           bcnt += j;
  92.           }
  93.        }
  94.        return(0);
  95. }
  96.  
  97. void ioctl(handle)
  98. int  handle;
  99. {
  100. union REGS inregs,outregs;
  101.     inregs.x.ax = 0x4400;
  102.     inregs.x.bx = handle;
  103.     intdos(&inregs,&outregs);
  104.  
  105.     if(outregs.h.dl & 0x80) {
  106.        inregs.x.ax = 0x4401;
  107.        inregs.h.dh = 0;
  108.        inregs.h.dl |= 0x20;
  109.        intdos(&inregs,&outregs);
  110.        }
  111. }
  112.  
  113. char    *set_copy(ch,st)
  114. char    ch;
  115. char    *st;
  116. {
  117.     copies = atoi(st);
  118.     if((copies < 1) || (copies > 99)) {
  119.         copies = 1;
  120.         fprintf(stderr,"-c parm invalid, set to 1\n");
  121.         }
  122.     return(NULL);
  123. }
  124.  
  125. char    *set_pells(ch,st)
  126. char    ch;
  127. char    *st;
  128. {
  129.     pells = atoi(st);
  130.     if((pells != 100) && (pells != 150) && ( pells != 300)) {
  131.         pells = 100;
  132.         fprintf(stderr,"-p parm invalid, set to 100\n");
  133.         }
  134.     return(NULL);
  135. }
  136.  
  137. char    *set_files(ch,st)
  138. char    ch;
  139. char    *st;
  140. {
  141.     if(f == NULL)
  142.         f = fopen(st,"rb");
  143.     else
  144.         print = open(st,O_WRONLY | O_BINARY | O_CREAT | O_TRUNC,S_IWRITE);
  145.     return(NULL);
  146. }
  147.  
  148. char    *set_xy(ch,st)
  149. char    ch;
  150. char    *st;
  151. {
  152. double    d;
  153.     d = atof(st);
  154.     d *= 720.0;
  155.     if((ch == 'x') || (ch == 'X')) x_offset = d;
  156.     if((ch == 'y') || (ch == 'Y')) y_offset = d;
  157.     return(NULL);
  158. }
  159.  
  160. void    setseek()
  161. {
  162. char    tmpbuf[132];
  163. int    i;
  164. long    junk;
  165.  
  166.     fread(tmpbuf,1,132,f);
  167.     tmpbuf[68] = '\0';
  168.     junk = 0l;
  169.  
  170.     if( (strcmp(&tmpbuf[65],"PNT") == 0) ||
  171.       ( (tmpbuf[128] == tmpbuf[129] == tmpbuf[130] == '\0') &&
  172.         ((tmpbuf[131] == '\002') || (tmpbuf[131] == '\003')) ) )
  173.         junk = 640l;
  174.     else
  175.       if( (tmpbuf[0] == tmpbuf[1] == tmpbuf[2] == '\0') &&
  176.         ( (tmpbuf[3] == '\002') || (tmpbuf[3] == '\003')) )
  177.         junk = 512l;
  178.  
  179.     if(junk != 0l) printf("Bypassing %ld bytes ...\n",junk);
  180.     else {
  181.         fprintf(stderr,"Can't determine file type\n");
  182.         exit(1);
  183.         };
  184.  
  185.     i = fseek(f,junk,0);
  186.     if(i) {
  187.        perror("Pattern bypass seek failed");
  188.        exit(1);
  189.        }
  190.  
  191. }
  192.  
  193. void    main(argCount, argVector)
  194. int    argCount;
  195. char    *argVector[];
  196. {
  197. int    i,count;
  198. long    where;
  199. int    f_flag = 0;
  200. int    m_flag = 0;
  201. int    t_flag = 0;
  202. char    *t_text = (char *) 0;
  203.  
  204. #define ArgCount  argCount
  205. #define ArgVector argVector
  206. #include <argbegin.h>
  207.     ArgMin          (1)
  208.     ArgMax          (2)
  209.     ArgDescription(tutorial)
  210.     ArgPosCall(set_files)
  211. #include <argloop.h>
  212.     ArgTextCall ('c', set_copy)
  213.     ArgTextCall ('C', set_copy)
  214.     ArgTextCall ('p', set_pells)
  215.     ArgTextCall ('P', set_pells)
  216.     ArgTextCall ('x', set_xy)
  217.     ArgTextCall ('X', set_xy)
  218.     ArgTextCall ('y', set_xy)
  219.     ArgTextCall ('Y', set_xy)
  220.     ArgFlagSet  ('n', neg)
  221.     ArgFlagSet  ('N', neg)
  222.     ArgFlagSet  ('m', m_flag)
  223.     ArgFlagSet  ('M', m_flag)
  224.     ArgFlagSet  ('t', t_flag)
  225.     ArgFlagSet  ('T', t_flag)
  226. #include <argend.h>
  227.  
  228.  
  229.     if(print == 0)
  230.        print = open("MAC.IMG",O_WRONLY | O_BINARY | O_CREAT | O_TRUNC,S_IWRITE);
  231.  
  232.     if(f == NULL) {
  233.        perror("Can\'t open input file");
  234.        exit(1);
  235.        }
  236.  
  237.     if(print == -1) {
  238.        perror("Can\'t open output file");
  239.        exit(1);
  240.        }
  241.  
  242.     ioctl(print);
  243.     setseek();
  244.  
  245.     write(print,header,16); /* Write out the header info */
  246.  
  247.     for(count=0;count < 720;count++) {
  248.        if(getline()) break;
  249.        putline();
  250.        }
  251.  
  252.     where = ftell(f);
  253.     printf("Complete at %ld\n",where);
  254.  
  255.     close(print);
  256.     fclose(f);
  257.  
  258. }
  259.